4日目 より高度なコマンド
4日目
キーワードをもとにコマンドを検索するには、apropos(アプロポス)コマンドが便利です。
aproposコマンド 名前が分からないコマンドを調べる
$ apropos directory | grep "(1)"
(1)が含まれるディレクトリに関連するマニュアルを探す
正規表現も使える
マニュアルのセクションの説明 https://gyazo.com/b03069ed7005dc8fcdbf02208137949e
$ whatis コマンド名 名前が分かっているコマンド
こちらも正規表現使える
オンラインマニュアルの検索の仕組み→whatisデータベースから検索してきている
cronによって自動更新されている
typeコマンド
組み込み関数とコマンド両方ある場合もある
code:typeの例
$ type -a pwd
pwd is a shell builtin →普通にコマンド実行するとこちらが優先される
pwd is /usr/bin/pwd
エイリアスの場合はエイリアスの内容を示す
code:type lsの例
$ type ls
ls is aliased to `ls --color=auto'
findコマンド
-mtimeオプション
Picturesディレクトリから3日以内に変更があったファイルを探す例
$ find Pictures -mtime 3
-mtimeはmodification timeの略
-typeオプション
ファイルやディレクトリなど種類を指定できる
$ find 起点となるディレクトリ -type ファイルの種類
d=ディレクトリ、 f=ファイル、 lシンボリックリンク
オプションをつなげて複数の条件を指定できる
code:findの例
次の例では、カレントディレクトリ「.」以下から、ディレクトリ名の先頭がアルファベットの大文字で始まるディレクトリを検索します。
$find . -name "AZ*" type -d Enter 条件の否定
条件の前に\!を記述する
カレントディレクトリ以下で拡張子が.txt以外、かつ拡張子が3文字のファイルを検索する場合の例
https://gyazo.com/877aad5ea7d41f527eff9f6fe6500da3
findコマンドの複数条件はAND検索
OR検索したいときは-oオプションをつける
コマンド置換
コマンドを組み合わせることができる
単純にパイプで繋ぐのではなく、コマンドの実行結果を引数として渡せる
バッククォート もしくは$( )内に記述する
パイプやコマンド置換でうまくいかない場合もある
引数の内容や実行するコマンドによる
-execオプションを使う
find 起点となるディレクトリ -exec 実行するコマンド {} \;
code:-execのエラー
$ find . -name "*.txt" -exec ls -l {} \
find: missing argument to `-exec'
-execはもしかしたら古いかも??
ファイルの検索(高速に検索する)
findは遅い
locateはデータベースから探してくるから早い
圧縮ファイルとアーカイブファイルの違い
https://gyazo.com/390da8b9d860137779ed947328a9bc45
zip形式のファイル・・・アーカイブされた後に圧縮されている
そういうファイルを作成するソフトは圧縮アーカイバという
Linuxで一般的な圧縮ファイルの種類
https://gyazo.com/5d2fe1585fd70b1aa3093e257590b08f
可逆圧縮と不可逆圧縮
その名の通り可逆性があるかどうか
不可逆=MP3、JPEGなど。圧縮率が高い。
gzipコマンド 圧縮コマンド
$ gzip ファイルのパス 可逆圧縮ファイルを作成する
$ gunzip 圧縮ファイルのパス
bzip2, bunzip2
zcatでファイルの中身を展開せずに確認できる
tarコマンド アーカイブファイルを作るコマンド
アーカイブファイルの拡張子は自分で指定しないといけない(gzipコマンドと違う)
一般的には.tarという拡張子を使う
tar -cfv アーカイブファイルのパス アーカイブするディレクトリ
-c=新規のアーカイブを作成する -v=ファイルの情報を表示する -f=アーカイブファイルのパスを指定する
ちょっと指定する順番が違うので注意!
アーカイブファイルの中身をみる
tar -tvf アーカイブファイルのパス
-t=一覧を表示する
アーカイブファイルを展開する
tar -xvf アーカイブファイルのパス
-x=ファイルを展開する
展開したら元の状態の階層構造に戻る
さらにアーカイブを圧縮すると圧縮アーカイブが作成できる
tar - cvzf public_html.tgz public_html
パイプでもつなげることができるが、オプションでもいける
gzip形式→圧縮アーカイブの拡張子.tar.gz or .tgz
-tvzf =圧縮アーカイブの一覧を表示
-xvzf=圧縮アーカイブの展開
パイプ | でつないで複数のコマンドを組み合わせて使うことができる
最初のコマンド以外は標準入力と標準出力の両方を使うものである必要がある
その条件を満たしていれば幾つでもつなげることができる
それらのコマンドのことをフィルタコマンドと呼ぶことがある
$ cat -n maillist.txt | tail| grep 'peachpress\.example\.com'
maillist.txt のなかの最新10件のメールアドレスの中から「peachpress.exmple.com」を含む行を登録番号とともの表示する
https://gyazo.com/4693e183f776f7ea98fe1c2e187159ff
フィルタコマンドの一例
cat ファイルの中身を表示
head 入力の最初の部分を表示
tail 入力の最後の部分を表示
sort 行を並べ替える
tr 文字を置換する
uniq 重複行を削除する
wc 文字数、単語数、行数を数える
sortコマンド テキストファイルを並べ替える
テキストファイルに1行に1件ずつデータを記述する形式を「リスト形式」という
テキストファイルにリストを格納する方式=CSV
1行データが入っており、フィールドの区切りにカンマを使う
sort テキストファイルのパス
先頭から順に文字列を比較してデフォルでは昇順で並べ替える
-rオプションを使うと反対にならぶ
sort -k 3,3 -t , mail.csv
sort -k 最初のフィールド番号 最後のフィールド番号(→省略可)
フィールドは1から数える上記だと3番目のフィールド
フィールドの区切りはデフォルトで空白かタブ
それ以外の場合は-t 区切り文字オプションで区切り文字を指定する
数値でソートする -nオプション
複数ファイルの中身をソートする
$sortk3nt,mail.csvmail2.csvEnter #←ファイルを2つ指定
他のコマンドと組み合わせる
パイプを使って組み合わせて使うことができる
例えばソート結果に番号つけて表示する
$sort -k 3 -n -t , mail.csv | cat -n
-k どのフィールドでソートするか=3番目のフィールド
-n 数字でソート
-t 区切り文字を指定=, で区切る
cat -n catコマンドを番号つきで実行
teeコマンド
標準入力の結果をファイルに書き出すと同時に画面にも表示するコマンド(下がイメージ)分岐処理を行っている
https://gyazo.com/bd300ce2c53a6cee77f86172e1ce1d1b
$ sort -k 3 -n -t , mail.csv | tee mailnew.csv
こう書くとmailne.csvに書き込むと同時に画面上にも出力できる
uniqコマンド 重複を見つける
uniq ファイルのパス
隣接する重複行のみ削除するという点に注意する
sortしておいて、そのあとuniqコマンドを実行すればOK
-u 最近のsortコマンドは重複行を表示しないオプションもある
uniqコマンドは重複したデータを抜き出す時に使える
-d 重複したデータのみを表示、-c 重複回数を表示、など
sortで並べ替えておくこと
wc 文字数をカウントする
code:wc
$ wc mail.txt
4 4 73 mail.txt
# 行数、単語数、文字数(バイト)の順で記載
wcコマンドのオプション
https://gyazo.com/f2d533aa7b384e70e461454886f68bae
code:wcディレクトリ
$ ls
-rw-rw-r--. 1 vagrant vagrant 148 Feb 24 07:37 cal-copy.txt
-rw-rw-r--. 1 vagrant vagrant 148 Feb 24 06:05 cal-p.txt
-rw-rw-r--. 1 vagrant vagrant 148 Feb 24 06:05 cal.txt
-rw-r--r--. 1 vagrant vagrant 451 Feb 21 15:11 crontab
drwxrwxr-x. 3 vagrant vagrant 17 Feb 12 03:41 dir1
-rw-rw-r--. 1 vagrant vagrant 0 Feb 12 03:42 file-1.txt
-rw-rw-r--. 1 vagrant vagrant 0 Feb 26 12:17 hello world.txt
-rw-rw-r--. 1 vagrant vagrant 73 Feb 24 06:16 mail.txt
-rw-rw-r--. 1 vagrant vagrant 53 Feb 24 06:14 newMail.txt
-rw-rw-r--. 1 vagrant vagrant 0 Feb 21 15:09 newfile1.txt
$ ls | wc
10 11 105 →行数、単語数、文字数
hello world.txtが二つ分とカウントされてしまったので単語数が行数と異なる
ls | wc -l とすれば(後ろは-L)ファイルの数として表示できる
trコマンド 文字列の置換
引数にファイル名を指定できないコマンド→標準入力しか受け付けないのでパイプでつなぐ
tr 文字1 文字2 < ファイルのパス
cat ファイルのパス | tr 文字列1 文字列2
文字単位の置換を行う
OK→aをA
NG→UNIXをLinux
tr -s 連続した文字列をひとつにまとめる文字
$tr tr -s " " < tr2.txt
空白をまとめる処理と置換を組み合わせると区切り文字を変更できる
$ tr -s " :," "," < tr3.txt